package org.gtesoreria

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;

import org.apache.commons.collections.list.LazyList;
import org.apache.commons.collections.FactoryUtils;

class Afiliado {
	static List ESTADOS_CIVILES = ["Soltero/a","Casado/a","Viudo/a","Concubino/a","Separado/a", "Divorciado/a"]
	static List SEXOS = ["Masculino","Femenino"]
	
    String legajo
    String apellidoNombre
    Date fechaNacimiento
    String dni
	String cuil
    String estadoCivil
	String sexo
    String calle
	String numero
	String piso
	String departamento	
	String localidad
	String codigoPostal
    String telefono
	String celular
    String email
    String estado = "ACTIVO"
    String cbu
	String numeroCuenta 
    String banco 
	String sucursal
    Date fechaIngreso
	Date fechaAfiliacion
	String observaciones
	String categoria
    Boolean esDelegado = false
    Afiliado delegado
    LugarTrabajo lugarTrabajo
	Dependencia dependencia
	Empresa empresa
	String mesNacimiento
	
	static searchable = [only: ['apellidoNombre', 'legajo','dni']]
	
    static constraints = {
        legajo(blank:false, unique:true, matches:"[0-9]+", nullable:false)
        apellidoNombre(blank:false, nullable:false)
		dni(blank:true, matches:"[0-9]+", nullable:true)
		estadoCivil(inList:ESTADOS_CIVILES, nullable:true)
		sexo(inList:SEXOS, nullable:true)
		cuil(nullable:true)
		calle(blank:true, nullable:true)
		numero(blank:true, nullable:true)
		piso(blank:true, nullable:true)
		departamento(blank:true, nullable:true)
		localidad(blank:true, nullable:true)
		codigoPostal(blank:true, nullable:true)
		celular(blank:true, nullable:true)
		numeroCuenta(blank:false, nullable:true)
		sucursal(blank:true, nullable:true)
        email(email:true, nullable:true)
        cbu(blank:true, nullable:true)
		observaciones(blank:true, nullable:true)
		fechaAfiliacion(nullable:true)
        delegado(nullable:true)
		lugarTrabajo(nullable:true)
		dependencia(nullable:true)
		empresa(nullable:true)
		categoria(nullable:true)
		mesNacimiento(nullable:true)
		banco(nullable:true)
		fechaNacimiento(nullable:true)
		fechaIngreso(nullable:true)
		telefono(nullable:true)
    }
	
	static transients = ["ESTADOS_CIVILES","SEXOS"]
    
    List familiars = new ArrayList()
    static hasMany = [ familiars : Familiar ]
 
    static mapping = {
        familiars cascade:"all-delete-orphan"
    }
 
    def getFamiliarList() {
        return LazyList.decorate(
              familiars,
              FactoryUtils.instantiateFactory(Familiar.class))
    }
	
	void setMesNacimiento( String mes) {
		if(fechaNacimiento){
			Calendar cal = Calendar.getInstance();
			cal.setTime(fechaNacimiento);
			mesNacimiento = cal.get(Calendar.MONTH) + 1;
		} else {
			mesNacimiento = null;
		}
	}
    
	def String returnEdad(){
		Calendar now = Calendar.getInstance();
		Calendar dob = Calendar.getInstance();
		if(fechaNacimiento == null)
			return "0";
		dob.setTime(fechaNacimiento);
		if (dob.after(now)) {
		  throw new IllegalArgumentException("Can't be born in the future");
		}
		int year1 = now.get(Calendar.YEAR);
		int year2 = dob.get(Calendar.YEAR);
		int age = year1 - year2;
		int month1 = now.get(Calendar.MONTH);
		int month2 = dob.get(Calendar.MONTH);
		if (month2 > month1) {
		  age--;
		} else if (month1 == month2) {
		  int day1 = now.get(Calendar.DAY_OF_MONTH);
		  int day2 = dob.get(Calendar.DAY_OF_MONTH);
		  if (day2 > day1) {
			age--;
		  }
		}
		return age;
		
	}
	
    def String toString() {
        return legajo;
    }
	
	def List printableProperties(){
		DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
		def fecha = formatter.format(this.fechaNacimiento);
		return [this.legajo,
			this.apellidoNombre,
			fecha,
			this.returnEdad(),
			this.lugarTrabajo?.nombre,
			this.delegado?.apellidoNombre,
			this.categoria ]
	}
}
